﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;

namespace MemoryDuosRankings
{
    public class RankingDAO
    {
        private SQLiteDatabase DB { get; set; }

        public RankingDAO(SQLiteDatabase DBnueva)
        {
            DB = DBnueva;
        }

        public int AñadirRanking(Ranking r)
        {
            Dictionary<String, String> data = new Dictionary<String, String>();
            data.Add("FechaInicio", r.FechaInicio.ToString());
            data.Add("Galería", r.Galería);
            data.Add("Nivel", r.Nivel.ToString());
            data.Add("Tiempo", r.Tiempo.ToString());
            if (DB.Insert("PartidaEstablecer", data))
            {
                int id = int.Parse(DB.ExecuteScalar("select id from PartidaEstablecer where FechaInicio='" + r.FechaInicio.ToString() + "' and FechaFin is null"));
                return id;
            }
            return 0;
        }

        public Ranking Parse(DataRow data)
        {
            var rnk = new Ranking(DateTime.Parse(data["FechaInicio"].ToString()), data["Galería"].ToString(), Convert.ToInt32(data["Nivel"]));
            rnk.ID = Convert.ToInt32(data["ID"]);
            if (!data["FechaFin"].ToString().Equals(""))
            {
                rnk.FechaFin = DateTime.Parse(data["FechaFin"].ToString());
            }
            if (!data["Tiempo"].ToString().Equals(""))
            {
                rnk.Tiempo = TimeSpan.Parse(data["Tiempo"].ToString());
            }
            if (!data["Acertadas"].ToString().Equals(""))
            {
                var datos = data["Acertadas"].ToString().Split(';');
                foreach (string par in datos)
                {
                    if (!par.Equals(""))
                    {
                        var listaPar = par.Split(',');
                        var tupla = Tuple.Create(int.Parse(listaPar.ElementAt(0)), int.Parse(listaPar.ElementAt(1)), int.Parse(listaPar.ElementAt(2)));
                        rnk.acertadas.Add(tupla);
                    }
                }
            }
            return rnk;
        }

        public List<Ranking> GetRankings()
        {
            var datos = DB.GetDataTable("select * from PartidaEstablecer");
            var devolver = new List<Ranking>();
            foreach (DataRow data in datos.Rows)
            {
                var rnk = this.Parse(data);
                devolver.Add(rnk);
            }

            devolver.Sort((a, b) => a.CompareTo(b));
            return devolver;
        }

        public List<Ranking> GetRankings(int nivel)
        {
            var datos = DB.GetDataTable("select * from PartidaEstablecer where nivel=" + nivel + " and FechaFin is not null");
            var devolver = new List<Ranking>();
            foreach (DataRow data in datos.Rows)
            {
                var rnk = this.Parse(data);
                devolver.Add(rnk);
            }
            devolver.Sort((a, b) => a.CompareTo(b));
            return devolver;
        }

        internal bool HayPartidaSinFinalizar()
        {
            var datos = DB.ExecuteScalar("select * from PartidaEstablecer where FechaFin is  null");
            if (!datos.Equals(""))
            {
                return true;
            }
            return false;
        }

        internal Ranking ObtenerPartidaSinFinalizar()
        {
            if (HayPartidaSinFinalizar())
            {
                var datos = DB.GetDataTable("select * from PartidaEstablecer where FechaFin is  null");
                var devolver = new List<Ranking>();
                foreach (DataRow data in datos.Rows)
                {
                    var rnk = this.Parse(data);
                    devolver.Add(rnk);
                }
                return devolver.ElementAt(0);
            }
            return null;
        }

        internal void FinalizarRanking(Ranking r,TimeSpan p)
        {
            Dictionary<String, String> data = new Dictionary<String, String>();
            data.Add("FechaFin", DateTime.Now.ToString());
            data.Add("Tiempo", p.ToString());
            DB.Update("PartidaEstablecer", data, "id=" + r.ID);
        }

        internal void PararRanking(Ranking r, TimeSpan p, string galeria,List<Tuple<int,int,int>> lista)
        {
            string estado= "";
            foreach (var par in lista)
            {
                estado = estado + par.Item1 + "," + par.Item2 + "," +par.Item3 + ";";
            } 
            Dictionary<String, String> data = new Dictionary<String, String>();
            data.Add("Tiempo", p.ToString());
            data.Add("Galería", galeria.ToString());
            data.Add("Acertadas", estado.ToString());
            DB.Update("PartidaEstablecer", data, "id=" + r.ID);
        }

        internal void EliminarRanking(Ranking r)
        {
            DB.ExecuteNonQuery("delete from PartidaEstablecer where id=" + r.ID);
        }
    }
}